package model

import (
	"fmt"
	"gin-blog/utils"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
	"time"
)

var db *gorm.DB
var err error

func InitDb() {
	// 新版的gorm的Open有变化，可以看看官方文档
	db, err = gorm.Open(utils.DbType,
		fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true&loc=Local",
			utils.DbUser, utils.DbPassWord, utils.DbHost, utils.DbPort, utils.DbName))

	if err != nil {
		fmt.Println("连接数据库失败，请检查参数：", err)
	}

	// 使用gorm框架会让表名默认设置为结构体的复数，如 type User struct {} 默认表名为users
	// 这样设置为true就可以禁用默认表名的复数形式
	// 要放在AutoMigrate前面，否则不生效
	db.SingularTable(true)

	// 自动迁移，用于保护数据，就是将在代码里加的结构体，作为表添加到数据库中
	db.AutoMigrate(&User{}, &Article{}, &Category{})

	// 并不是直接连接数据库，只是虚拟一个连接池，要用时才连接上去，所以需要设置这些参数
	// 设置连接池中最大连接数
	db.DB().SetMaxIdleConns(10)
	// 设置数据库最大连接数
	db.DB().SetMaxOpenConns(100)
	// 设置连接的最大可复用时间
	// 注意：不可大于进入框架的连接时间，现在没有设置，在r.RUN里有个默认参数，超过了就会于数据库断开连接，从而导致错误
	db.DB().SetConnMaxLifetime(10 * time.Second)

	//db.Close()
}
